iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
佛心分享-IT 人自學之術

區塊鏈技術應用系列 第 15

Solidity中的錯誤處理方法

  • 分享至 

  • xImage
  •  

Solidity 中常見的錯誤處理方法 require()、assert() 和 revert()
1. require 函數
用於驗證輸入參數或某些條件是否滿足。如果條件不滿足,require 會恢復狀態變更 並返回剩餘的 gas。

  • 語法:require(condition, "Error message");
    如果條件不成立,它會停止合約的執行,恢復先前的狀態,並顯示一條錯誤消息。
    1. condition:這是一個布林表達式(true 或 false),如果這個條件是 true, 合約就繼續執行;如果是 false,合約的執行會停止,並且所有先前的狀態變更 (例如數據更改)會被恢復。
    2. "Error message":當 condition 為 false 時,require 會顯示這個錯誤信 息,幫助用戶理解為什麼合約執行失敗。

假設有一個簡單的銀行合約,允許用戶取款,但用戶只能取出自己擁有的餘額:
https://ithelp.ithome.com.tw/upload/images/20240928/20169238y4bok8Gn9g.png

  • 上圖中的紅框內是SPDX 授權標識符,用來指定你的合約代碼的授權條款,讓其他人了解如何合法地使用、修改或分發你的代碼。
  • // SPDX-License-Identifier: MIT(公開)
  • // SPDX-License-Identifier: UNLICENSED(不公開)
  • 這行注釋需要放在 pragma solidity
    2. assert 函數
    通常用於測試不應發生的邏輯錯誤或內部狀態驗證。如果條件不成立,assert 會導致合約執行失敗並消耗掉所有的 gas。
    語法:assert(condition);
    驗證合約內部變量或狀態不應違反某些邏輯規則。
    https://ithelp.ithome.com.tw/upload/images/20240928/2016923866fSaXFqXT.png

3. revert 函數
是一種手動觸發錯誤的方式,可用於更靈活的錯誤處理。例如當某些複雜條件不滿足 時,revert 可以立即停止合約的執行,並返回錯誤消息。

  • 語法:if (!condition) {
    revert("Error message");
    }

4. 自定義錯誤 (Solidity 0.8.4+)
這是Solidity 新增了自定義錯誤功能,這使得錯誤處理更具描述性,並且節省 gas。
語法:error Unauthorized(address caller);
https://ithelp.ithome.com.tw/upload/images/20240929/20169238bO6UuskWzZ.png
總結
* require 用於檢查輸入或外部條件,若不滿足則恢復狀態變更,並退還 gas。
* assert 用於內部狀態驗證,確保不變量在執行過程中保持不變,若失敗則消耗所有 gas。
* revert 用於手動觸發錯誤,並返回錯誤消息,允許更細緻的錯誤處理。
* 自定義錯誤 提供更靈活的錯誤信息,並節省 gas。


上一篇
Solidity中的Inheritance與Polymorphism
下一篇
Solidity 中的時間操作與區塊時間戳
系列文
區塊鏈技術應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言